校验表单
企企的系统中的单据,我们默认草稿保存(非提交)的时候是不做校验的。但是有些用户可能更喜欢在保存的时候做提前的数据校验。在我们目前的产品中还没有参数可以开启保存时校验。但是我们可以通过脚本来实现。
下面的脚本演示了在保存时,调用 form.validate()
方法来校验数据。
thisApp.onSave = async (ctx) => {
const form = ctx.getFormContext().form;
if (! await form.validate()) {
// 我们需要调用 cancel 方法阻止保存方法的继续执行。
ctx.getEventArgs().cancel();
// 提示一下用户
qiqi.ui.message.showWarning('表单数据没有通过校验,请检查');
}
};
validate
方法不仅在form
中存在,在field
中也存在。validate
是一个async
的方法。所以记得通过await
或者form.validate().then(...).catch(...)
来调用。- 校验失败需要
ctx.getEventArgs().cancel()
方法来阻止表单继续执行保存数据的动作。
上面的方式满足我们没有自定义字段,或者自定义字段已经配置了业务规则的情况。有时我们需要更精细的校验控制,我们就可以自定义校验器。
添加校验器有两种方式:
- 通过
field.addValidator
方法添加校验器。 - 通过
form.addValidator
方法添加校验器。
校验报销单的联系电话
这段脚本演示了在填写报销单时,如果用户填写的联系电话长度小于 11 位则产生一个错误。
thisApp.formOnLoad = async (ctx) => {
const form = ctx.getFormContext().form;
/**
* 给联系电话增加一个自定义的校验器
* 为了演示方便,这里我们假设联系电话必须是手机,并且长度必须不少于 11 位
*/
form.addValidator('applyUserTelephone', field => {
const value = field.value;
if (value && value.length < 11) {
return '长度不能低于 11 位';
}
});
};
校验报销单长途子表中的出发地和目的地不能相同
thisApp.formOnLoad = async (ctx) => {
const form = ctx.getFormContext().form;
/**
* 校验长途的出发地和目的地,如果不同则报错。
*/
const validateDistrict = (line) => {
const fromDistrict = qiqi.util.get(line, 'fromDistrict.id');
const toDistrict = qiqi.util.get(line, 'toDistrict.id');
if (fromDistrict && toDistrict && fromDistrict === toDistrict) {
return '出发地和目的地不能相同';
}
}
form.addValidator('reimburseTransports.fromDistrict', field => {
return validateDistrict(field.parent.value);
});
form.addValidator('reimburseTransports.toDistrict', field => {
return validateDistrict(field.parent.value);
});
};
关联字段校验
比如子表有两列, 一列文本列(字段:csCeShiWenBen), 一列是创建人(字段:createUser), 存在这样一个需求: 当创建人名字选的是"智元"时, 文本列必填。
处理这个需求时我们不仅仅是要考虑到 fieldChange 的时机, 另外一个要面对的是编辑态: 编辑一个保存过的草稿, 提交时也要对创建人是"智元"行的文本列进行非空校验。
实现时要考虑两点:
- 校验器: 给文本列加非空校验器
- 校验时机: 创建人变化时校验文本列, 这就建立了一依赖关系, 文本列的校验时机依赖于创建人的变化
thisApp.formOnLoad = async (ctx) => {
const formContext = ctx.getFormContext();
const form = formContext.form;
/**
* 添加具有依赖关系的校验器,
* @param logicPath 源字段或列的logic path, 要校验的字段
* @param validator 校验器
* @param dependencies 依赖字段的 logic path, 依赖的字段值变化时会触发源字段的校验
*/
form.addDependentValidator('csDetailListItems.csCeShiWenBen', (field) => {
const rowData = field.parent.value;
const userName = qiqi.util.get(rowData, 'createdUser.name');
if (userName === '智元' && rowData.csCeShiWenBen === '') {
return '创建人是智元时, 测试文本不能为空';
}
}, ['csDetailListItems.createdUser'])
}